#!/bin/bash -xe
#// -x option echos commands
#// -e option does not continue, if error was raised
if [ -e ~/reset_env.sh ]; then source ~/reset_env.sh ;fi
export WORK="$HOME/work"
export w_DownloadFolder="$WORK/download"
export w_XWindowPackage="$w_DownloadFolder/X11R7.5_110527.tar.bz2"
export w_XWindowFolder="$WORK/X11R7.5"
#//(end of export)
folder=${w_XWindowFolder%/*} #// parent folder
if [ ! -e "$folder" ]; then mkdir -p "$folder" ;fi
cd "$folder"
if [ -e "$w_XWindowFolder" ]; then rm -r "$w_XWindowFolder" ;fi
tar xvf "$w_XWindowPackage"
echo "Created $w_XWindowFolder"
参考
X11R7.5_110527.tar.bz2
X11R7.5
w_XWindowPackage
w_XWindowFolder
sudo apt-get install p7zip-full
インストール (ubuntu)
解凍
7za x -so a.7z | tar xf -
7za x -so
| tar xf -
解凍が始まらないときは、
7za x a.7z
tar xvf a.tar
ホームページに .gz ファイルがある場合、自動的に展開しますが、
wget では自動的に展開しません。
どちらも、ダウンロードしたファイルは、.gz 拡張子が付いたままになるので
ファイル名から展開済みかどうかは判定できません。
gunzip コマンドを実行して、エラーを無視するようにしてください。
gunzip で展開すると、展開前の圧縮ファイルが消えてしまいます。
gzip で圧縮すると、圧縮前のファイルが消えてしまいます。
このため、gz ファイルをマスターファイルとして扱おうとすると、
いつのまにか消えてしまう危険があります。
$ unzip -l 1GB.zip
Archive: 1GB.zip
Length Date Time Name
-------- ---- ---- ----
1279152000 09-28-11 09:54 1GB.txt
125 09-28-11 09:51 batch.bat
-------- -------
1279152125 2 files
パスのみ表示するには、sed も同時に使います。
$ unzip -l a.zip | sed -e "1,3d" -e '/^ ---/,$d' -e "s/.*:[0-9]* *//"
1GB.txt
batch.bat
md5sum
#!/bin/bash -xe
#// -x option echos commands
#// -e option does not continue, if error was raised
export w_Arvhice="arvhice.tar.7z"
export w_md5sum="$w_Arvhice.md5sum.txt"
md5sum "./$w_Arvhice" > md5sum_out.txt
diff "md5sum_out.txt" "$w_md5sum"
if [ "$?" == "0" ]; then echo "OK" ; rm "md5sum_out.txt" ;fi
arvhice.tar.7z
MD5 の値が正しいかチェックします。
$w_Arvhice.md5sum.txt
カレント・ディレクトリに arvhice.tar.7z ファイルと、arvhice.tar.7z.md5sum.txt ファイル
をコピーして、下記のスクリプトを実行してください。
合っていれば、OK と表示されます。
※ echo "OK" の前の if は、bash -e オプションによって中断するため要らないが、
分かりやすさのために書いています。
参考
を開いて、パッケージ名を使ってページ内を検索します。
の
または、そのページにある All GNU packages の章から探します。
GNU 製のパッケージの多くは、apt-get でもインストールできますが、ソースからインストール
したいときは、次の手順で行います。
その先は、パッケージによって内容は大きく異なります。
ダウンロードへのリンクがないときは、
Linux アプリケーション
VNC
VNC 単体では、サーバーからログインしないと接続できません。
リモートデスクトップの Linux 版
X Window System上で動くデスクトップ環境
ファイルマネージャ
このボタンを押すと、絶対パスが表示され、コピー&ペーストできます。
関連
→ X(Window)
でも、使えます。
nautilus
X Window over ssh
シェルから
ls
ファイルを一覧する
テキストファイルの内容を見る
テキストエディタ
端末で [Tab] キーを押すと、ファイル名が補完されます。
ファイルコピー、-rp オプションでフォルダコピー。sudo が必要な場合もあり。
mkdir
フォルダの作成。 -p オプションで、連続作成
コマンドの前に sudo をつけると、スーパーユーザーで実行します。
ただし、パスワードの入力を要求されます。(要・端末)
rm
ファイルの削除、-r オプションでフォルダの削除
mv
移動。移動先がフォルダならその中へ。
移動元と移動先が同じフォルダでないと改名できない。
/usr/local/bin は、デフォルトでパスが通っています。
ディストリビューションの /usr/local/bin には、何も入っていません。
検索、フィルタ
コマンドのヘルプを表示します。
端末を開く(ubuntu)
[ アプリケーション | アクセサリ | 端末 ]
リンクを作成する
リモート端末
関連
PATH=$HOME/tools:$PATH
PATH を追加するときは、次のようにコロン(:)で区切ります。
which (command)
コマンドを入力したときに実行される実行ファイルの場所が、PATH の中のどこに
ヒットしているかは、which コマンドで確認できます。
ただし、表示されたパスは、シンボリックリンクの可能性もあります。
add_path=`readlink -f .`
case $PATH in *$add_path*);; *) PATH=$add_path:$PATH; esac
カレント・フォルダーが PATH に含まれていなかったら追加する。
echo $TERM
端末の種類は、TERM 環境変数で確認できます。 emacs や vi は、この変数を参照しています。
echo $SHELL
"/bin/bash"
"xterm"
… dash では、差別を避けるためか bash に設定されています
ls -l /bin/sh
/bin/sh -> dash
… こちらの方が正確
sudo dpkg-reconfigure -plow dash
dash と bash を切り替える
上記を実行すると、/bin/sh を dash にするか bash にするか選ぶことができます。
「はい」を選ぶと dash、「いいえ」を選ぶと bash になります。
シェル・スクリプト・ファイルの先頭が #!/bin/bash であれば、bash が使われています。
→ コマンドラインの引数とエスケープ (DOS)
関連
#include <stdio.h>
int main(int argc, char const* argv[]) {
int i;
for (i = 1; i < argc; i++) {
printf("[%s]\n", argv[i]);
}
return 0;
}
$./a.out '$TERM'
[$TERM] ... シングルクォートでは、変数が展開されません。
$./a.out "$TERM"
[xterm] ... ダブルクォートでは、変数が展開されます。
$./a.out '\\'
[\\] ... シングルクォートでは、エスケープされません。
$./a.out "\\"
[\] ... ダブルクォートでは、エスケープされます。
$./a.out "\""
["]
$./a.out "\n"
[\n] ... ダブルクォートでも、\\, \" 以外はエスケープされません。
エスケープされないときでも、\ が無くなることはありません。
$./a.out \n
[n] ... 囲んでいないときは、エスケープされます。
$./a.out \ a
[ a] ... 囲んでいないときは、空白もエスケープされます。
$./a.out "\ a"
[\ a]
$./a.out -a b
[-a] ... オプション形式も、そのまま渡ります。
[b]
$./a.out \-a
[-a]
$./a.out "\-a"
[\-a]
実験用 C 言語ソース
実験結果
; & ( ) | ^ < > ? * [ ] $ ` " ' { } [TAB] [SPACE]
エスケープが必要な文字
command arg1 arg2 ...
コマンドラインに入力するとき、コマンド名に続いて、任意の数のパラメーターを並べます。
オプションの指定方法は、- に続けてオプション名を入力し、パラメーターを持つオプションは、
スペースで区切った後に入力します。
command -a arg1 -b b_param arg2
-a がパラメーターを持たないオプションであれば、arg1 は -a オプションのパラメーターでは
ありません。
-b がパラメーターを持つオプションであれば、b_param は -b オプションのパラメーターです。
パラメーターの区切りと、オプションとパラメーターの間の区切りが、どちらもスペースであるという
ややこしい仕様であるため、コマンドのパラメーターであるか、オプションのパラメーターであるかは、
それぞれのオプションの仕様を確認する必要があります。
#!/bin/bash -e
#//=== parse command line options
g_AllArguments="$@"
if [ "$1" == "--help" ]; then
g_IsHelp="1" ; shift 1
else
unset g_IsAOption
unset g_BOptionValue
while getopts "ab:" OPT ;do
case $OPT in
"a" ) g_IsAOption="1" ;;
"b" ) g_BOptionValue="$OPTARG" ;;
"?" ) unset ERROR;${ERROR:?unknown option or no option parameter} ;;
esac
done
shift $(($OPTIND - 1))
fi
#//=== using option values
if [ "$g_IsHelp" == "1" ]; then
echo "help"
else
echo "g_IsAOption=$g_IsAOption"
echo "g_BOptionValue=$g_BOptionValue"
echo "1=$1"
echo "others=$*"
fi
参考
getopts の引数に、短いオプション名を並べます。
パラメーターを取るオプションは、オプション名の後に : を付けます。
shift $(($OPTIND - 1)) すると、$* の内容が、オプション以外になります。
$~/temporary.sh -a -b boys value1 value2
g_IsAOption=1
g_BOptionValue=boys
1=value1
others=value1 value2
$~/temporary.sh --help
help
~/temporary.sh
実行例
getopts は、関数の中では使えません。
コマンドラインのオプションに指定した値を取得します。
2文字以上のオプション名には対応していません。
-r, -r param #// POSIX 形式、Unix98 形式
r, r param #// BSD 形式
--reverse, --reverse=param #// GNU 形式
Linux 系のオプションの書式は、いくつかあります。
getopt 関数 (gcc)
参考
//グローバル変数
extern char* optarg; // オプション引数
extern int optind; // 次に解析する argv の配列番号
extern int opterr; // 0を設定すると、エラーメッセージを出力しない
extern int optopt; // エラーが発生したオプション文字
int main( int argc, char* argv[] )
{
int opt;
for (;;) {
opt = getopt( argc, argv, "ab:" );
if ( opt == -1 ) break;
switch ( opt ) {
case 'a': printf( "-a\n" ); break;
case 'b': printf( "-b %s\n", optarg ); break;
case '?': // その他オプション
}
}
2文字以上のオプションは、getopt_long や getopt_long_only を使う
(cache)
user1@ubuntu:~$ ./a.out \\-a -b c d e
opt='b' optarg=c optind=4
opt='-1' optind=3
[-b]
[c]
[\-a]
[d]
[e]
#include <stdio.h>
#include <getopt.h>
int main(int argc, char* argv[]) {
int i;
int opt;
for (;;) {
opt = getopt( argc, argv, "ab:" );
if ( opt == -1 ) break;
printf( "opt='%c' optarg=%s optind=%d\n", opt, optarg, optind );
}
printf( "opt='-1' optind=%d\n", optind );
for (i = 1; i < argc; i++) {
printf("[%s]\n", argv[i]);
}
return 0;
}
getopt の動き
オプションが、オプションではない引数の後になった場合、opt=-1 になると、
argv の要素が入れ替わります。
標準入出力をファイルに接続します。 つまり、キーボードから入力する代わりに
ファイルの内容を入力したり、画面に出力する代わりにファイルに出力します。
2>&1 を書かないと、標準エラー出力を取りこぼしてしまいます。
echo a > sample X 2>&1
関連
echo a >&2
… 標準エラー出力へ
/dev/stdin ファイルが、標準入力(仮想的なデバイス)を表しています。
/dev/stdin ファイルを指定すると、シェルから入力した内容が、ファイルの内容として
扱われます。
$ cp /dev/stdin ~/a.txt
This is text
^C
$ type ~/a.txt
This is text
シェルから次のように入力すると、ファイルコピーの代わりに、シェルから入力した
内容がファイルに格納されます。
ln -s /dev/console /dev/stdin
sudo ln -s /proc/self/fd/0 /dev/stdin
/dev/stdin が無いときは、次のようにすれば作成できます。
/dev/console がある場合:
/proc/self/fd がある場合:
参考
echo 'test' 2>&1 | sudo tee ~/temp.txt
リダイレクトの代わりに、sudo tee を使います。
echo a > /dev/null
… a を表示しない
保存するファイル名を指定するときは、" " や ' ' で囲むとエラーになります。
空白を含むファイル名を指定するときは、\ でエスケープしてください。
echo a > sample\ X 2>&1
… sample X ファイルができる
echo a > sample X 2>&1
… sample ファイルができる
… " " で囲むとエラーになる
echo a > "sample X" 2>&1
(from man sh)
The following redirection is often called a “here-document”.
[n]<< delimiter
here-doc-text ...
delimiter
All the text on successive lines up to the delimiter is saved away and
made available to the command on standard input, or file descriptor n if
it is specified. If the delimiter as specified on the initial line is
quoted, then the here-doc-text is treated literally, otherwise the text
is subjected to parameter expansion, command substitution, and arithmetic
expansion (as described in the section on “Expansions”). If the operator
is “<<-” instead of “<<”, then leading tabs in the here-doc-text are
stripped.
echo a > sample.txt
a と表示する代わりに sample.txt ファイルに出力します。
read -p "prompt>" VAR < input.txt
キーボード入力の代わりに input.txt の
内容を入力します。
command <<delimiter
text
text
delimiter
<< を指定すると、標準入力に入力する内容を、コマンドラインの中に記述することが
できます。
delimiter (終端文字列)は、任意の単語に置き換えることができますが、このように
なっているのは、適切な単語が使えるようにするためではなく、テキストと delimiter
が衝突しないようにするためです。 通常は下記のように HereDocument にして、
ネットでキーワード検索ができるようにしておきます。
テキストの行頭に、空白文字を入れると、空白文字を含んだテキストになるので、
インデントした記述ができないことに注意してください。
サンプル
cat >> sample.h <<HereDocument
#define A 1
#define B 1
HereDocument
sample.h ファイルに、#define A 1 と #define B 1 を追記します。
while read from_file 0<&3 ;do
echo $from_file
read from_stdin
echo $from_stdin
done 3< input.txt
exec 3>- #// close fd5
プログラム
キーボード
画面
fd0=stdin : 標準入力
fd1=stdout : 標準出力
fd2=stderr : 標準エラー出力
リダイレクトを使わない通常の場合、
ですが、> を記述すると fd1 の行き先がファイルになります。
< を記述すると fd0 の出発点がファイルになります。
標準出力(fd1)と、標準エラー出力(fd2)以外に、独自の種類の入出力として、3以上の
ファイル記述子を使うことができます。 たとえば、ファイル記述子5を、詳細ログという
種類であるとして、command.log に出力するときは、次のように記述します。
exec 5>command.log #// fd5 is details of log
echo abc >&5
exec 5>- #// close fd5
参考
ただし、このような用途のためだけであれば、出力ファイル名を環境変数にした方が
分かりやすいでしょう。
echo abc > $log
入力にもナンバー3以上のファイル記述子が使えます。 下記のコードは、キーボード
入力と、ファイル input.txt による入力を、1行ずつ交互に入力します。 (使い道は
よく分かりません。)
参考
if [ "1" == "1" ] ; then
echo abc
echo def
fi > command.log
ブロックの中で行われる echo 出力は、
すべて command.log にリダイレクトされます。
while, do 〜 done ブロックでも使えます。
関連
expr a + 1 > /dev/null 2>&1
… 標準エラー出力も表示しない
参考
diff <( cat "a.txt" ) <( cat "b.txt" )
ls | grep "a.txt"
ファイルを指定するところに、コマンドの実行を代わりに指定することができます。
上記は、下記と同じですが、上記の grep は、サブシェルにはなりません。
grep "a.txt" < <( ls )
リダイレクトする内容のファイルを指定するところにも使えます。